【Unity】創建自己的有限狀態機

有限狀態機,大概大家都聽過吧,沒聽過的

這裡請

不過基本上都是用到的時候學啦,以前有看了幾天,發現我的智力不足,先放棄

但最近專題要開始使用,所以…火坑我來了

看完中文,建議研究一下英文的,下面有實作

這裡

本篇是根據英文的實作改了一下做出來的筆記,說是筆記,因為是雛形,然後又不知道哪邊觀念可能錯誤,請多多指教一下XD

研究了這麼久,我認為實作有限狀態機,最重要的概念是

繼承,抽象

整個看起來是這樣,完成之後才要在創建個AIController去使用它

img

首先先創建個基類BaseState,此類別為抽象類別

繼承他的實作他的DoSomething(Gameobject npc)方法,這個抽象方法

很重要,因為所有繼承他的類別都有這個方法,至於為何,等到用到會再說明

img

接下來,開始創建使用它的機器,((先不用創建它有哪些狀態))

img

這個類也是不用繼承MonoBehavior,因為真正要用狀態機的不是這個類

首先,狀態”機”,的機,肯定是集合很多狀態而成的,因此宣告一個List把所有狀態都

裝在一起,再宣告當前狀態 currentstate ,在建構子上為這個list創建空間,狀態機可能

會有,新增、查詢、刪除…等 ,因為只是筆記最簡單的怎麼用,因此用一個普通的新增

方法就好。

好,接下來可以想一下你要什麼狀態了,這裡先用A狀態跟B狀態來表示,創建每個狀態

然後繼承於BaseState類

img

B狀態也跟這上面一樣,我就不貼囉,然後選好狀態之後,差不多就完成了

接下來要創建個控制器,也就是最終你會貼到Unity的編輯室窗上的component,也可以說成AI

首先,在這個AI裡面,要先創建個狀態機,也就是剛剛集合所有State的 FSMMachine

接著把所有會用到的State宣告一下

img

接著宣告完之後,在Start方法中把它(狀態) 加入到創建的fsm中

img

fsm中,加入了a、b狀態,currentstate是目前狀態,因為一開始沒指定,所以在start方法也順變指定為a

接著再Update中,呼叫doSomthing方法,傳入gameobject

img

注意這邊 fsm.currentstate ,上面再Start方法中指定為a,因此目前做的是a的dosomthing方法

如果把fsm.currentstate = b的話,就會執行b的dosomthing方法,這裡就是精華所在了

換另外一個狀態,上一個狀態就不會再繼續執行,就像switch case做的狀態機一樣

而目前的Controller中,沒辦法轉換狀態,因此加入一個ToState方法

img

傳入一State,然後改變fsm的currentstate(當前狀態)

完整如下

img

這個類就完成了,接著去每個狀態中實現他們的方法

img

如果按下滑鼠左鍵,則轉換到狀態b,因該不用多解釋了吧XD

接著把Controller掛到隨便一個物體上,運行就會像這樣

img

另外,Unity還有使用interface實現FSM的方法,個人比較喜歡那個,比較簡潔。

參考資料 : http://wiki.unity3d.com/index.php/Finite_State_Machine